# 访问限制 类似于 Java的private
# 属性的名称前加两个下划线__，就变成了一个私有变量（private），只有内部可以访问，外部不能访问
# 这样就确保了外部代码不能随意修改对象内部的状态，这样通过访问限制的保护，代码更加健壮。


class Teacher(object):
    def __init__(self, name, age, salary, course):
        self.name = name
        self.__age = age
        self.__salary = salary
        self.course = course

    def set_salary(self, salary):
        if salary < 20000:
            self.__salary = salary
        else:
            return 'Salary is too high to given!'

    def get_info(self):
        return '%s is a %s teacher' % (self.name, self.course)

    def get_self_info(self):
        return '%s is %d old and salary is %.2f' % (self.name, int(self.__age), float(self.__salary))


t1 = Teacher('Bob', 38, 5000, 'Physics')
print(t1.name + 'is a '+t1.course + ' Teacher!')
print(t1.set_salary(30000))
print(t1.get_info())
print(t1.get_self_info())

# 变量名类似__xxx__，双下划线开头，双下划线结尾的，是特殊变量，特殊变量是可以直接访问的，不是private变量，所以，不能用__name__、__score__这样的变量名。
# 一个下划线开头的实例变量名，如_name，这样的实例变量外部是可以访问的，但是，按照约定俗成的规定，当你看到这样的变量时，意思就是，
# “虽然我可以被访问，但是，请把我视为私有变量，不要随意访问”。
# 不能直接访问__age是因为Python解释器对外把__age变量改成了_Teacher__age，所以，仍然可以通过_Teacher__age来访问__age变量

print(t1._Teacher__age)  # 但是强烈建议你不要这么干，因为不同版本的Python解释器可能会把__age改成不同的变量名
t1.__age = 50
print(t1.__age)  # 这个__age 并不是class里的那个__age class里的__age已经被改装成类似于_Teacher__age了。
print(t1.get_self_info())
